package faktorI;

public class LstPrav extends Lista{
	private static LstPrav instanca;
	
	private LstPrav(){}
	
	public static LstPrav instanca(){
		if(instanca == null) return instanca = new LstPrav();
		else return instanca;
	}
	
	public boolean postoji(Pravilo pravilo){
		for (Pravilo tek = (Pravilo)prvo; tek != null; tek = (Pravilo)tek.next){
			if(pravilo.jednako(tek))return true;
		}
		return false;
	}
	
	public boolean dodaj(Pravilo pravilo){
		if(!postoji(pravilo)){
			if (prvo == null)
				prvo = posl = pravilo;
			else {
				posl.next = pravilo;
				posl = pravilo;
			}
			return true;
		}
		else throw new Greska("Pravilo vec postoji u sistemu.");
	}
	
	public Pravilo pronadji(int brPravila){
		Pravilo tek = (Pravilo)prvo;
		for(int i=0; i<brPravila-1; i++){
			if(tek != null && tek.next != null)tek = (Pravilo)tek.next;
			else return null;
		}
		return tek;
	}
	
	public void popuniListuZakljucaka(){
		LstZaklj.instanca().isprazni();
		for (Pravilo tek = (Pravilo)prvo; tek != null; tek = (Pravilo)tek.next){
			LstZaklj.instanca().dodaj(tek.getZakljucak());
		}
	}
	
	public boolean daLiJeZakljucak(PredElem elem){
		for (Pravilo tek = (Pravilo)prvo; tek != null; tek = (Pravilo)tek.next){
			if(elem.getNaziv().equals(tek.getZakljucak().getNaziv()))return true;
		}
		return false;
	}
	
	public void popuniListuOpazanja(){
		LstOpaz.instanca().isprazni();
		for (Pravilo tek = (Pravilo)prvo; tek != null; tek = (Pravilo)tek.next){
			Iterator iterator = new Iterator(tek.getPreduslov().getElemList());
			iterator.first();
			while(!iterator.isDone()){
				PredElem temp = (PredElem)iterator.currentItem();
				if((temp.jeOperand()) && (!daLiJeZakljucak(temp))){
					LstOpaz.instanca().dodaj(new Opazanje(temp));
				}
				iterator.next();
			}
		}
	}
	
	public void updateOpazanja(Opazanje operand){
		for (Pravilo tek = (Pravilo)prvo; tek != null; tek = (Pravilo)tek.next){
			tek.updateOpazanja(operand);
		}
	}
	
	public void dodeliBrojeve(){
		int i=1;
		for (Pravilo tek = (Pravilo)prvo; tek != null; tek = (Pravilo)tek.next){
			tek.setRedniBroj(i++);
		}
	}
	
	public Pravilo getPraviloSaZakljuckom(Zakljucak zaklj, int i){
		for (Pravilo tek = (Pravilo)prvo; tek != null; tek = (Pravilo)tek.next) {
			if(tek.getZakljucak().getNaziv().equals(zaklj.getNaziv())){
				i--;
				if(i == 0)return tek;
				else continue;
			}
		}
		return null;
	}
	
	public void refresh(){
		for (Pravilo tek = (Pravilo)prvo; tek != null; tek = (Pravilo)tek.next)tek.refresh();
	}
	
	public static void setPravila(LstPrav lista){instanca = lista;}
	
	public String toString(){
		String s = "PRAVILA:\n\n";
		if(!prazna()){
			int i=0;
			for (Pravilo tek = (Pravilo)prvo; tek != null; tek = (Pravilo)tek.next){
				i++;
				s += i;
				s += ")";
				s += tek;
				s += "\n\n";
			}
			return s;
		}
		else
			return s + "Lista pravila je prazna!\n";
	}
}
